import axios from 'axios';
import { message } from 'antd';
import store from '../stores/configureStore';
import * as LoadingAction from '../actions/LoadingAction';
import {validateAuth, refreshAuth} from './auth';

const codeMessage = {
  // 200: '服务器成功返回请求的数据',
  // 201: '新建或修改数据成功。',
  // 202: '一个请求已经进入后台排队（异步任务）',
  // 204: '删除数据成功。',
  400: '错误请求,请求参数有误!',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '请求错误,未找到该资源',
  405: '请求方法未允许',
  406: '请求的格式不可得。',
  408: '请求超时',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器',
  502: '网关错误',
  501: '网络未实现',
  503: '服务不可用，服务器暂时过载或维护',
  504: '网关超时',
  505: 'http版本不支持该请求',
};

axios.defaults.timeout = 25000;

// axios.defaults.headers = {};

function log(response) {
  if (process.env.NODE_ENV === 'development') {
    const { data, config } = response;
    if (data.success) {
      console.log(
        `%c\n返回数据：${config.url}`,
        `color: ${data.success ? '#1da57a' : '#f44336'}`,
      );
      console.log(data.data);
    }
  }
}

axios.interceptors.response.use(
  (response = {}) => {
    store.dispatch(LoadingAction.hide());
    log(response);
    const { success, error = '接口返回错误' } = response.data;
    if (!success) {
      if (error) {
        message.error(error);
        throw new Error(`${response.config.url}:${error}`);
      }
    } else if (response.config.url === '/api/login') {
      refreshAuth(response.data.data);
    }
    return response.data;
  },
  error => {
    store.dispatch(LoadingAction.hide());
    if (error && error.response) {
      error.message = codeMessage[error.response.status] ||
        `连接错误${error.response.status}`;
    } else {
      error.message = '连接到服务器失败';
    }
    message.error(error.message);
    return Promise.reject(error.message);
  },
);

/**
 * @param url: 接口的地址
 * @param method： 请求方式
 * @param params： 参数
 * @param loading: 加载中状态
 * @returns {AxiosPromise}
 * author: 卢忠宽
 */
export default ({ url, method = 'get', params = {}, loading = true }) => {
  // 本地验证登陆
  if (url !== '/api/login' || url !== '/api/logout') {
    validateAuth();
  }

  // loading
  loading && store.dispatch(LoadingAction.show());

  let options = { url, method };
  method === 'get' ? options.params = params : options.data = params;
  return axios(options);
};